import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Class Plane representa el dibujo que controla el jugador.
 * @author Programación Orientada a Objetos - Adrián Cerda Cerda 
 * @version  Abril-Mayo 2012
 */
public class Plane extends Aeronave
{
   
     World mundo;
     private int cont=0;// contador para no disparar tan rapido
     private int vel;// variable para determinar la velocidad del Avión 
     private int numC=0;// variable para agregar diferente tipo de ciudad
     
     /**
     * Se encarga de realizar las acciones del Avion(Plane) para que actue en el Mundo
     */
    public void act() 
    {
        girar();
        disparar();
        chocar();
        dameVelocidad();
        dameVelocidadY();
        llegarCiudad();
       
    }
    /**
     * Si se presiona la tecla ESPACE el Avion va a disparar
     * Dispra en dirección en la que se encuentra 
     */
    public void disparar()
    {
        int r=0;
        cont=cont+1;
        if(Greenfoot.isKeyDown("space")&& cont>=8)
         { 
             Bala1 b1= new Bala1();
             Greenfoot.playSound("pop.wav");
             mundo= super.getWorld();
             mundo.addObject(b1,getX(),getY());
             r=getRotation();
             b1.setRotation(r);
             cont=0;
         }   
    }
    /** 
     * Verifica si choca con algun Enemigo(Helicoptero) 
     * El Helicoptero se elmina en caso de que choquen y el Avion pierde una Vida
     */
    public void chocar()
    {
        Actor heli;
        heli= super.getOneObjectAtOffset(0,0,Helicoptero.class);
        if(heli!=null)
        {
            mundo= super.getWorld();
            mundo.removeObject(heli);
            PlaneWorld w= (PlaneWorld) super.getWorld();
            w.disminuyeVida();
            this.setLocation(getX()+4,getY()+4);
            Explosion exp= new Explosion();
            mundo.addObject(exp,getX(),getY());
            mundo.addObject(heli,
                           Greenfoot.getRandomNumber(mundo.getWidth()-15),
                           Greenfoot.getRandomNumber(mundo.getHeight()-15));
        }
    }
    /**
     * Dependiendo de la direccón en que valla el Avion 
     * va a calcular la velocidad en que se debe mover el Avion 
     * @return vel Regresa la velocidad en que debe de ir sobre las X
     */
    public int dameVelocidad()
    {
        int r= getRotation();
        calcularVelocidadX(r);
        return vel;
    }
    /**
     * calcula la velocidad en que se debe de mover el Avion en forma Horizontal 
     * @param r para saber la direccion en que va el Avion
     */
    public void calcularVelocidadX(int r)
    {
        if( r>=345 && r<360 || r>=0 && r<=15)
             vel=3;
        else if(r>=15 && r<45 || r>=315&&r<345)
             vel=2;
        else if(r>=45 && r<75 || r>=285&&r<315)
             vel=1;
        else if(r>=75 && r<=105 || r>= 255&& r<285)
             vel=0;
        else if(r>=105 && r<135 || r>= 225 && r<255)
             vel=-1;
        else if(r>=135&& r<165 || r>= 195 && r<225)
            vel=-2;
        else if(r>=165 && r<195)
            vel=-3;
      }
    /** 
     * Dependiendo de la direccón en que valla el Avion 
     * va a calcular la velocidad en que se debe mover el Avion 
     * @return vel Regresa la velocidad en que debe de ir sobre las Y
     */
    public int dameVelocidadY()
    {
        int r= getRotation();
        calcularVelocidadY(r);
        return vel;
    }
     /**
     * calcula la velocidad en que se debe de mover el Avion en forma Vertical 
     * @param r Para saber la direccion en que va el Avion
     */
    public void calcularVelocidadY(int r)
    {
        if( r>=345 && r<360 ||r>=0 && r<15 || r>=165 && r<195)
          vel=0;
         
        else if(r>=15 && r<45 || r>=135&&r<165)
          vel=1;
        else if(r>=45 && r<75 || r>=105&&r<135)
          vel=2;
        else if(r>=75 && r<=105 )
          vel=3;
        else if( r>= 255&& r<285)
            vel=-3;
        else if(r>=225 && r<255 || r>= 285 && r<315)
          vel=-2;
        else if(r>=195&& r<225 || r>= 315 && r<345)
          vel=-1;
     }
    /**
     * Si se presiona la tecla left o right va girar 
     * en el sentido a la tecla presionada
     */
    public void girar()
    {
        if(Greenfoot.isKeyDown("left"))
          turn(-5);
        if(Greenfoot.isKeyDown("right"))
          turn(5);
    }
    /**
     * Detecta cuando el Avion llega a una Ciudad 
     * Si llega aparecee otra ciudad a la cual el avion tendra tambien que viajar
     */
     public void llegarCiudad()
    {
        Actor ciudad;
        ciudad= super.getOneObjectAtOffset(0,0,Ciudad.class);
        if(ciudad!=null)
        {
            mundo= super.getWorld();
            mundo.removeObject(ciudad);
            PlaneWorld w= (PlaneWorld) super.getWorld();
            w.aumentaPuntos();
            numC= numC+ 1;
            Ciudad c= new Ciudad(numC);
            mundo.addObject(c, Greenfoot.getRandomNumber(mundo.getWidth()-15),
                               Greenfoot.getRandomNumber(mundo.getHeight()-15));
        }
    }   
        
}
